// 定义依赖收集通知类


export default class Dep {
  constructor() {
    this.deps = new Set();
  }

  depend() {
    // add 进一个 watch 实例
    console.log('====================================');
    console.log(Dep.target);
    console.log('====================================');
    if (Dep.target) {
      this.deps.add(Dep.target);
    }
  }

  notify() {
    this.deps.forEach((watcher) => watcher.update());
  }
}

// Dep.target这个概念也是Vue中所引入的，它是一个挂在Dep类上的全局变量
// Dep.target 一定是一个 watcher 实例
Dep.target = null;

// watcher栈
const targetStack = [];

// 将上一个watcher推到栈里，更新Dep.target为传入的_target变量。
export function pushTarget(_target) {
  // 如果 Dep.target 已经存在，先保存到栈里
  if (Dep.target) targetStack.push(Dep.target);
  Dep.target = _target;
}

// 取回上一个 watcher 作为 Dep.target，并且栈里要弹出上一个  watcher。
export function popTarget() {
  // 删除最后一个元素
  Dep.target = targetStack.pop();
}
